/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import modelo.Articulo;
import modelo.Usuario;
import modelo.Venta;

/**
 *
 * @author Cristian Perez
 */
public class VentasDao {
    private static VentasDao instance = null;

    public VentasDao() {
        //Instanciacion de Singleton
    }

    public static VentasDao getInstance() {
        if (instance == null) {
            instance = new VentasDao();
        }
        return instance;
    }

    private boolean existeArticuloCargado(Connection c, long codigo) throws SQLException {
       Statement stmtConsulta = null;
       //Creo la consulta
       String laConsulta = "SELECT * FROM ventas WHERE idArt='"+codigo+"'";
       //Creo la sentencia
       stmtConsulta = c.createStatement();
       //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
       ResultSet rs = stmtConsulta.executeQuery(laConsulta);

        if (rs.next()) {
            stmtConsulta.close();
            return true;
        }else {
            stmtConsulta.close();
            return false;
        }
    }

    private int devolverIDventa (Connection c, long cod) throws SQLException {
        Statement stmtConsulta = null;
       //Creo la consulta
       String laConsulta = "SELECT id FROM ventas WHERE idArt='"+cod+"'";
       //Creo la sentencia
       stmtConsulta = c.createStatement();
       //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
       ResultSet rs = stmtConsulta.executeQuery(laConsulta);
       rs.next();
       return (rs.getInt("id"));
    }

    private int devolverCantidadArt(Connection c, long cod) throws SQLException {
        Statement stmtConsulta = null;
       //Creo la consulta
       String laConsulta = "SELECT cantidad FROM ventas WHERE idArt='"+cod+"'";
       //Creo la sentencia
       stmtConsulta = c.createStatement();
       //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
       ResultSet rs = stmtConsulta.executeQuery(laConsulta);
       rs.next();
       return (rs.getInt("cantidad"));
    }

    private float devolverTotalArt(Connection c, long cod) throws SQLException {
        Statement stmtConsulta = null;
       //Creo la consulta
       String laConsulta = "SELECT total FROM ventas WHERE idArt='"+cod+"'";
       //Creo la sentencia
       stmtConsulta = c.createStatement();
       //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
       ResultSet rs = stmtConsulta.executeQuery(laConsulta);
       rs.next();
       return (rs.getFloat("total"));
    }

    private void actualizarVenta (Connection c, Venta ven, int idVenta) throws SQLException {
        Statement stmt = null;
        try {
            int cantTotal = ( devolverCantidadArt(c, ven.getArt().getCod()) + ven.getCantidad());
            float valorTotal = ( devolverTotalArt(c, ven.getArt().getCod()) + ven.getTotal());
            String query = "UPDATE ventas SET cantidad='"+cantTotal+"', total='"+valorTotal+"' WHERE id='"+idVenta+"'";
            stmt = c.createStatement();
            stmt.execute(query);
        }catch(Exception e) {e.printStackTrace(); stmt.close();}
    }

    public void agregar(Connection c, Venta vent) throws SQLException {
        Statement stmt = null;
        try {
            if (existeArticuloCargado(c, vent.getArt().getCod())) {
                int idVenta = devolverIDventa(c, vent.getArt().getCod());
                actualizarVenta(c, vent, idVenta);
            }
            else {
                String query = "INSERT INTO ventas (usr, idArt, cantidad, fecha, hora, total) VALUES ('"+vent.getUsr().getNombreUsuario()+"','"+vent.getArt().getCod()+"','"+vent.getCantidad()+"','"+vent.getFecha()+"','"+vent.getHora()+"','"+vent.getTotal()+"')";
                stmt = c.createStatement();
                stmt.execute(query);
            }
        }catch(Exception e) {e.printStackTrace(); stmt.close();}
    }

    public void eliminarItem(Connection c, int id) throws SQLException {
        Statement stmt = null;
        try {
            String query = "DELETE FROM ventas WHERE id='"+id+"'";
            stmt = c.createStatement();
            stmt.execute(query);
        }catch(Exception e) {e.printStackTrace(); stmt.close();}
    }

    public ArrayList getTodos (Connection c) throws SQLException {
        //Creo la variable lista donde la consulta me va a devolver los registros
        ArrayList lista = new ArrayList();
        Statement stmtConsulta = null;

        //Creo la consulta
            String laConsulta = "SELECT * FROM ventas ORDER BY id ASC";
            //Creo la sentencia
            stmtConsulta = c.createStatement();
            //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
            ResultSet rs = stmtConsulta.executeQuery(laConsulta);
            //Cargo la lista
            while (rs.next()) {
                Usuario usr = UsuariosDao.getInstance().dameUsuarioPorNombre(c, rs.getString("usr"));
                Articulo art = ArticulosDao.getInstance().getArticuloXcodigo(c, rs.getLong("idArt"));
                Venta venAux = new Venta(rs.getInt("id"), usr, art, rs.getInt("cantidad"), rs.getString("fecha"), rs.getString("hora"), rs.getFloat("total"));
                lista.add(venAux);
            }
            stmtConsulta.close();
            //Retorno la lista
            return lista;
    }

    public void vaciarTablaVentas(Connection c) throws SQLException {
        Statement stmt = null;
        try {
            String query = "truncate ventas";
            stmt = c.createStatement();
            stmt.execute(query);
        }catch(Exception e) {e.printStackTrace(); stmt.close();}
    }

    public void efectuarVenta(Connection c) {
         Statement stmt = null;
       try {
           ArticulosDao.getInstance().actualizarStock(c);
           HistorialVentasDao.getInstance().agregar(c, getTodos(c));
           vaciarTablaVentas(c);
       }catch(Exception e) {e.printStackTrace();}
       finally {
            try {
                stmt.close();
            }catch(Exception ee) {}
        }
    }
    
}
